/**
 * 
 */
package com.mc.getui;

import java.io.IOException;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * @author w.weizhen
 *
 */
public class GeTui {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String token = auth();
        if(token != null && token != "")
        {
            //toApp(token);
            toList(token);
        }
    }
    
    //在个推开发者中心创建应用时生成，是您的应用与SDK通信的标识之一，每个应用都对应一个唯一的AppID。
    private static final String appId = "3ROesE5vzh804uUgnq8VZ";
    //预先分配的第三方应用对应的Key，是您的应用与SDK通信的标识之一。
    private static final String appkey = "fhwUzQIDpu7Hny1PXOrWl8";
    //个推服务端API鉴权码，用于验证调用方合法性。在调用个推服务端API时需要提供。（请妥善保管，避免通道被盗用）
    private static final String mastersecret = "Km7X4IWPxF6LFJRgLQwyM6";
    private static final String baseUrl = "https://restapi.getui.com/v2/"+appId;
    //获取鉴权token
    //鉴权接口每分钟最大调用量为100次，每天最大调用量为10万次，建议开发者妥善管理token，以免达到限制，影响推送
    //token有效时间24小时
    //token是个推开放平台全局唯一接口调用凭据，访问所有接口都需要此凭据，开发者需要妥善保管。
    //token的有效期截止时间通过接口返回参数expire_time来标识，目前是接口调用时间+1天的毫秒时间戳。
    //token过期后无法使用，开发者需要定时刷新。为保证高可用，建议开发者在定时刷新的同时做被动刷新，即当调用业务接口返回错误码10001时调用获取token被动刷新
    private static String auth()
    {
        String token = "";
        String url = baseUrl+"/auth";
        //毫秒时间戳（13位），请使用当前毫秒时间戳，误差太大可能出错
        String timestamp = System.currentTimeMillis()+"";
        //生成 sign 值：将 appkey、timestamp、mastersecret 对应的字符串按此固定顺序拼接后，使用 SHA256 算法加密。
        String sign = Hashing.sha256().newHasher().putString(appkey+timestamp+mastersecret, Charsets.UTF_8).hash().toString();
        JSONObject data = new JSONObject();
        data.put("sign", sign);
        data.put("timestamp", timestamp);
        data.put("appkey", appkey);
        System.out.println(data.toJSONString());
        String body = okHttp(url, "", data.toJSONString());
        System.out.println(body);
        if(body != null && body != "")
        {
            data = JSONObject.parseObject(body);
            data = data.getJSONObject("data");
            token = data.getString("token");
        }
        return token;
    }
    
    //批量推，指向指定的一批用户推送消息
    private static void toList(String token)
    {
        //先创建消息，然后推送给指定设备。
        String url = baseUrl+"/push/list/message";
        long timeMillis = System.currentTimeMillis();
        JSONObject notification = new JSONObject();
        notification.put("title", "toList通知标题"+timeMillis);
        notification.put("body", "toList通知内容"+timeMillis);
        notification.put("click_type", "url");//信息点击之后的操作
        notification.put("url", "https://www.baidu.com/");
        
        JSONObject push_message = new JSONObject();
        push_message.put("notification", notification);
        
        JSONObject settings = new JSONObject();
        settings.put("ttl", 3600000);
        
        JSONObject data = new JSONObject();
        data.put("request_id", timeMillis+"");
        data.put("group_name", "toList任务组名"+timeMillis);
        data.put("settings", settings);
        data.put("push_message", push_message);
        
        System.out.println(data.toJSONString());
        String body = okHttp(url, token, data.toJSONString());
        System.out.println(body);
        data = JSONObject.parseObject(body);
        data = data.getJSONObject("data");
        String taskid = data.getString("taskid");
        
        url = baseUrl+"/push/list/cid";
        
        JSONArray cid = new JSONArray();
        //cid.add("48e2fe5c14ee21fa89323db7f1edc127");
        cid.add("0b0e4520d9ca7d5fb1fc04549e280cd1");
        
        JSONObject audience = new JSONObject();
        audience.put("cid", cid);
        
        data = new JSONObject();
        data.put("audience", audience);
        data.put("taskid", taskid);
        data.put("is_async", true);
        
        System.out.println(data.toJSONString());
        body = okHttp(url, token, data.toJSONString());
        System.out.println(body);
    }
    
    //群推，指向APP符合筛选条件的所有用户推送消息，支持定速推送、定时推送，支持条件的交并补功能
    private static void toApp(String token)
    {
        String url = baseUrl+"/push/all";
        long timeMillis = System.currentTimeMillis();
        JSONObject notification = new JSONObject();
        notification.put("title", "toApp通知标题"+timeMillis);
        notification.put("body", "toApp通知内容"+timeMillis);
        notification.put("click_type", "url");
        notification.put("url", "https://www.baidu.com/");
        
        JSONObject push_message = new JSONObject();
        push_message.put("notification", notification);
        
        JSONObject settings = new JSONObject();
        settings.put("ttl", 3600000);
        
        JSONObject data = new JSONObject();
        data.put("request_id", timeMillis+"");
        data.put("group_name", "toApp任务组名"+timeMillis);
        data.put("settings", settings);
        data.put("audience", "all");
        data.put("push_message", push_message);
        
        System.out.println(data.toJSONString());
        String body = okHttp(url, token, data.toJSONString());
        System.out.println(body);
        
        
    }
    
    
    
    private static String okHttp(String url, String token, String datas){
        String body = "";
        MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .addHeader("token", token)
                .post(RequestBody.create(mediaType, datas))
                .build();
        try {
            Response response = client.newCall(request).execute();
            if (response.isSuccessful())
            {
                body = response.body().string();
            }
            else
            {
                System.err.println(response.body().string());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return body;
    }
}